"""Header_Information
------------------------------------
    File_Name: 数字日期和时间
    Author: RR9
    Date: 2024/09/11
    Description: 
------------------------------------
"""
import math

"""3.1 数字的四舍五入
'''
round: 四舍五入, 当在中间的时候返回离它最近的偶数， 如3.5和4.5 返回 4
向下取整：math.ceil()
向上取整：math.floor() 、 整除//(10//3)

'''
import math

print(round(2.1))
print(round(2.5))
print(round(2.6))
# 向上取整
print(math.ceil(2.0))
print(math.ceil(2.1))
# 向下取整
print(math.floor(2.0))
print(math.floor(2.9))
print(10//3)

"""

"""3.2 执行精确的浮点数运算 
'''
decimal.Decimal 处理浮点数的精确运算
'''
from decimal  import Decimal

a1 = 4.2
b1 = 2.1
print(a1 + b1)  # 6.300000000000001

a2 = Decimal('4.2')  # 必须使用单引号
b2 = Decimal('2.1')
print(a2 + b2)  # 6.3

a3 = 1.1
b3 = 2.2
print(Decimal(str(a3))+Decimal(str(b3)))  # 3.3 , 必须将变量转换为字符串

"""
"""3.3 数字的格式化输出 
'''
format(x,','): 千分位分隔
format(x,'.1f'): 浮点数保留1位
format(x,',.1f'): 千分位分隔并保留一位
'''
x = 12345.6789
print(format(x, ','))  # 12,345.6789
print(format(x, '.2f'))  # 12345.68
print(format(x, ',.2f'))  # 12,345.68

"""

"""3.4 二八十六进制整数 
'''
bin(): 二进制
oct(): 八进制
hex(): 十六进制
'''
x = 12345
print(bin(x))  # '0b11000000111001'
print(oct(x))  # '0o30071'
print(hex(x))  # '0x3039'


"""
"""3.5 字节到大整数的打包与解包"""
"""3.6 复数的数学运算 """
"""3.7 无穷大与 NaN
'''
python 通过float()函数创建
正无穷：float('inf')
负无穷：float('-inf')
NaN: float('nan') 2个nan 并不是同一对象

可以通用math.isinf()/math.isnan() 检测
'''
a = float('inf')
b = float('-inf')
c = float('nan')

print(math.isinf(a))  # True
print(math.isinf(b))  # True
print(math.isnan(c))  # True

print(9 + a)  # inf
print(9 * a)  # inf
print(9 // a)  # 0.0

print(a / a)  # nan
print(a * a)  # inf

c = float('nan')
d = float('nan')
print(c == d)  # False
print(c is d)  # False
e = float('inf')
print(a == e, a is e)  # True False

"""

"""3.8 分数运算 """
"""3.9 大型数组运算 
'''
普通列表操作与 numpy.array操作区别, numpy.array 作用到每一个元素上
'''
# 普通列表操作
x = [1, 2, 3, 4]
y = [5, 6, 7, 8]
print(x * 2)  # [1, 2, 3, 4, 1, 2, 3, 4]
# print(x + 2) # 报错 TypeError: can only concatenate list (not "int") to list
print(x + y)  # [1, 2, 3, 4, 5, 6, 7, 8]

# Numpy arrays
import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

print(a * 2)  # [2 4 6 8]
print(a + 2)  # [3 4 5 6]
print(a + b)  # [ 6  8 10 12]


def f(x):
    return 3 * x ** 2 - 2 * x + 7


# 对于每一个元素都需要计算的时候，numpy很有用
print(f(b))

"""
"""3.10 矩阵与线性代数运算 """
"""3.11 随机选择 
'''
随机 random

'''
import random

va = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 从列表中随机抽出 1个数
print(random.choice(va))

# 从列表中随机抽出 N个数
print(random.sample(va, 2))  # 返回一个列表

# 打乱列表排序
print(random.shuffle(va))

# 随机生成整数1-99
print(random.randint(1, 99))  # 包含1和99

"""
"""3.12 基本的日期与时间转换 """
'''
datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
datetime.strftime():
    1. 可以自定义输出日期格式
    2. 可以将字符串日期转为datetime
'''
from datetime import datetime, timedelta

# 当前时间
d1 = datetime.now()
d2 = d1 + timedelta(seconds=30)
d3 = d1 + timedelta(hours=1)
d4 = d1 + timedelta(days=10)
d5 = d1 + timedelta(days=-2)
dd = d1 + timedelta(seconds=30)
print('type:::', type(dd))
print('当前时间：', d1.strftime('%Y-%m-%d %H:%M:%S'))
# 30秒之后
print('30秒之后:', d2.strftime('%Y-%m-%d %H:%M:%S'))
# 1小时之后
print('1小时之后:', d3.strftime('%Y-%m-%d %H:%M:%S'))
# 10天之后的时间
print('10天之后的时间:', d4.strftime('%Y-%m-%d %H:%M:%S'))

# 2天之前
print('2天之前:', d5.strftime('%Y-%m-%d %H:%M:%S'))

# 日期时间计算
t1 = '2024-09-09 15:35:24'
t2 = '2024-09-11 12:35:44'
# 将字符串转为datetime
d_t1 = datetime.strptime(t1, '%Y-%m-%d %H:%M:%S')
d_t2 = datetime.strptime(t2, '%Y-%m-%d %H:%M:%S')
# 差值
delta = d_t2 - d_t1
# 天
days = delta.days
# 秒
seconds = delta.seconds
# 小时
hours = seconds // 3600
# 分钟
minutes = seconds // 60
print("-" * 20)
print(f"相差天数: {days}")
print(f"相差小时: {hours}")
print(f"相差分钟: {minutes}")
print(f"相差秒数: {seconds}")

"""3.13 计算最后一个周五的日期 """
"""3.14 计算当前月份的日期范围 """
"""3.15 字符串转换为日期 """
"""3.16 结合时区的日期操作 """
